diff -Nur a/drivers/net/wireless/zd1211rw/zd_chip.h b/drivers/net/wireless/zd1211rw/zd_chip.h
--- a/drivers/net/wireless/zd1211rw/zd_chip.h	2006-11-19 04:28:22.000000000 +0100
+++ b/drivers/net/wireless/zd1211rw/zd_chip.h	2006-11-27 13:11:37.517266800 +0100
@@ -627,7 +627,9 @@
 	FW_BASE_ADDR_OFFSET		= FW_START_OFFSET + 0x1d,
 	EEPROM_START_OFFSET		= 0xf800,
 	EEPROM_SIZE			= 0x800, /* words */
+	LOAD_CODE_START_OFFSET	= 0xffe9,
 	LOAD_CODE_SIZE			= 0xe, /* words */
+	LOAD_VECT_START_OFFSET	= 0xfff7,
 	LOAD_VECT_SIZE			= 0x10000 - 0xfff7, /* words */
 	EEPROM_REGS_OFFSET		= LOAD_CODE_SIZE + LOAD_VECT_SIZE,
 	E2P_BASE_OFFSET			= EEPROM_START_OFFSET +
diff -Nur a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c
--- a/drivers/net/wireless/zd1211rw/zd_usb.c	2006-11-19 04:28:22.000000000 +0100
+++ b/drivers/net/wireless/zd1211rw/zd_usb.c	2006-11-27 14:16:41.286063000 +0100
@@ -319,6 +319,27 @@
 	return r;
 }
 
+static int is_firmware_loaded(struct usb_device *udev)
+{
+	int r;
+	u16 reset_vector;
+
+	r = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+	USB_REQ_FIRMWARE_READ_DATA,
+	USB_DIR_IN | USB_TYPE_VENDOR,
+	LOAD_VECT_START_OFFSET, 0, &reset_vector, sizeof(reset_vector), 5000 /* ms */);
+	if (r != sizeof(reset_vector)) {
+		dev_err(&udev->dev,
+		       "control request firmeware read."
+		       " Return value %d\n", r);
+		if (r >= 0)
+			return -ENODEV;
+		}
+	/* If a firware is loaded the reset_vector is the start of the
+	* firmware */
+	return cpu_to_le16(reset_vector) == FW_START_OFFSET;
+}
+
 static void disable_read_regs_int(struct zd_usb *usb)
 {
 	struct zd_usb_interrupt *intr = &usb->intr;
@@ -935,18 +956,31 @@
 		goto error;
 	}
 
-	r = upload_firmware(udev, id->driver_info);
-	if (r) {
+	r = is_firmware_loaded(udev);
+	if (r < 0) {
 		dev_err(&intf->dev,
-		       "couldn't load firmware. Error number %d\n", r);
+		       "you should unplug/replug your device");
 		goto error;
 	}
-
-	r = usb_reset_configuration(udev);
-	if (r) {
-		dev_dbg_f(&intf->dev,
-			"couldn't reset configuration. Error number %d\n", r);
+	/* TODO if the firmware was already loaded, upload new firmware here
+	* hangs. We should reload the firmware in a latter stage after a
+	* FW_SOFT_RESET because the current firmware could different from
+	* the one we wanted.
+	*/
+	if (r == 0) {
+		r = upload_firmware(udev, id->driver_info);
+		if (r) {
+		dev_err(&intf->dev,
+		       "couldn't load firmware. Error number %d\n", r);
 		goto error;
+		}
+
+		r = usb_reset_configuration(udev);
+		if (r) {
+			dev_dbg_f(&intf->dev,
+				"couldn't reset configuration. Error number %d\n", r);
+			goto error;
+		}
 	}
 
 	/* At this point the interrupt endpoint is not generally enabled. We
@@ -972,7 +1006,6 @@
 	dev_info(&intf->dev,"%s\n", netdev->name);
 	return 0;
 error:
-	usb_reset_device(interface_to_usbdev(intf));
 	zd_netdev_free(netdev);
 	return r;
 }
@@ -991,13 +1024,6 @@
 	zd_usb_disable_rx(usb);
 	zd_usb_disable_int(usb);
 
-	/* If the disconnect has been caused by a removal of the
-	 * driver module, the reset allows reloading of the driver. If the
-	 * reset will not be executed here, the upload of the firmware in the
-	 * probe function caused by the reloading of the driver will fail.
-	 */
-	usb_reset_device(interface_to_usbdev(intf));
-
 	/* If somebody still waits on this lock now, this is an error. */
 	zd_netdev_free(netdev);
 	dev_dbg(&intf->dev, "disconnected\n");
